﻿#region License
// Copyright (c) 2007 James Newton-King
//
// Permission is hereby granted, free of charge, to any person
// obtaining a copy of this software and associated documentation
// files (the "Software"), to deal in the Software without
// restriction, including without limitation the rights to use,
// copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the
// Software is furnished to do so, subject to the following
// conditions:
//
// The above copyright notice and this permission notice shall be
// included in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
// OTHER DEALINGS IN THE SOFTWARE.
#endregion

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using NUnit.Framework;
using Newtonsoft.Utilities.Logging;

namespace Newtonsoft.Utilities.Tests.Logging
{
  public class LoggerTests : TestsBase
  {
    [Test]
    public void Trace()
    {
      Logger.Log("Before");
      Logger.Trace("DefaultTrace", () =>
                                   {
                                     Logger.Log("Hi1");
                                     Logger.Log("Hi2");
                                   });
      Logger.Log("After");

      Assert.AreEqual(6, DefaultLogger.Entries.Count);

      Assert.AreEqual("Before", DefaultLogger.Entries[0].Message);
      Assert.AreEqual("    Trace Start: DefaultTrace", DefaultLogger.Entries[1].Message);
      Assert.AreEqual("    Hi1", DefaultLogger.Entries[2].Message);
      Assert.AreEqual("    Hi2", DefaultLogger.Entries[3].Message);
      StringAssert.StartsWith("    Trace End: DefaultTrace (elapsed time:", DefaultLogger.Entries[4].Message);
      Assert.AreEqual("After", DefaultLogger.Entries[5].Message);
    }

    [Test]
    public void TraceException()
    {
      MemoryLogger logger = new MemoryLogger();
      Logger.Loggers.Add(logger);

      Logger.Log("Before");
      try
      {
        Logger.Trace("DefaultTrace", () =>
        {
          Logger.Log("Hi1");
          throw new Exception("Blarrg!");
        });
      }
      catch
      {
      }
      Logger.Log("After");

      Assert.AreEqual(6, logger.Entries.Count);

      Assert.AreEqual("Before", logger.Entries[0].Message);
      Assert.AreEqual("    Trace Start: DefaultTrace", logger.Entries[1].Message);
      Assert.AreEqual("    Hi1", logger.Entries[2].Message);
      StringAssert.StartsWith(@"    Trace Error:
        An exception of type 'System.Exception' occurred and was caught.
        ----------------------------------------------------------------
        01/01/2000 14:01:00
        Type : System.Exception, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
        Message : Blarrg!
        Source : Newtonsoft.Utilities.Tests
        Help link : 
        Data : System.Collections.ListDictionaryInternal", logger.Entries[3].Message);

      Assert.AreEqual("After", logger.Entries[5].Message);
    }
  }
}
